#include "Socket.hpp"
#include "Protocol.hpp"
#include <iostream>
#include <unistd.h>
#include <memory>

#include "TcpServer.hpp"
#include "Calculate.hpp"
using namespace std;
using namespace Network;
using namespace Protocol;
using namespace CalCulate;

string HandlerRequest(string &inbufferstream, bool *error_code)
{
    *error_code = true;
    // 0.计算器对象
    Calculate calculate; // 计算器

    // 1.构建一个响应对象
    unique_ptr<Factory> factory = make_unique<Factory>();
    auto req = factory->BuildRequest();

    // 2.分析字节流，看是否有一个完整的报文

    string total_resp_string;
    string message;
    while (Decode(inbufferstream, &message))
    {

        cout<<message<<endl;
        // 3.我一定读到了一个完整的报文，可以进行反序列化了
        if (!req->Deserialize(message)) // 反序列化
        {
            *error_code = false;
            return string();
        }
        // 4.业务处理了
        auto resp = calculate.Cal(req);

        // 5.序列化
        string send_string;
        resp->Serialize(&send_string); //"result code"

        // 6.构建完成字符串级别的响应报文（添加报头）
        send_string = Encode(send_string);

        // 7.发送
        total_resp_string+=send_string;
    }
    return total_resp_string;
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        cout << "Usage:\n     ./udp_echo_server <port>" << endl;
        return 0;
    }

    uint16_t localport = stoi(argv[1]);

    unique_ptr<TcpServer> svr(new TcpServer(localport, HandlerRequest));
    svr->Loop();
    return 0;
}
